package org.moonlight.jvm.rtda.exclusive;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.moonlight.jvm.rtda.share.heap.classmember.Method;

/**
 * 运行时数据区 - 线程独占区 - 线程 - 虚拟机栈 - 栈帧
 *
 * 每个方法执行时都会创建一个栈帧，栈帧中包含：操作数栈、局部变量表、动态连接、方法出口、指向常量池的指针等等方法执行所需要的信息
 *
 * @author Moonligt
 * @createTime 2023/8/16 10:39
 **/
@Getter
@EqualsAndHashCode
public class Frame {

    /** 下一个栈帧 **/
    @Setter
    private Frame next;
    @Setter
    private int nextPc;
    /** 局部变量表 **/
    private final LocalVars localVars;
    /** 操作数栈 **/
    private final OperandStack operandStack;
    /** 当前方法 **/
    private final Method method;
    /** 所属线程 **/
    private final Thread thread;

    public Frame(Thread thread, Method method) {
        this.localVars = new LocalVars(method.getMaxLocals());
        this.operandStack = new OperandStack(method.getMaxStack());
        this.thread = thread;
        this.method = method;
    }

    /**
     * 将栈帧的 nextPc 重置 让其指向 当前指令
     *
     * @createTime 8:57 2023/9/13
     * @author moonlight
     **/
    public void revertNextPc() {
        this.nextPc = this.thread.getPc();
    }
}
